Tip
阅读指南
上一节,我带你看了“涌现能力”——当模型规模足够大时,会突然展现出从未被明确训练过的能力。但在所有涌现出来的能力中,有一个能力尤其特殊,特殊到它几乎改变了我们使用AI的方式。
这个能力叫做In-Context Learning(情境学习,或称上下文学习)。
简单来说:
不需要重新训练模型,只需要在提示词中给几个例子,模型就能学会一个新任务。
第一次听到这个能力时,可能会觉得:“这有什么特别的?”
但这是一个革命性的突破。一起来看看。
情感分类任务示例
我用一个非常直观的例子,展示情境学习是什么。
任务:情感分类
假设要让ChatGPT判断电影评论是“正面”还是“负面”。
需要标注几千到几万条评论:
“这部电影太棒了!” → 正面
“浪费时间” → 负面
……
用这些数据训练一个分类器。
时间:几小时到几天。
成本:数千到数万元。
模型学会了这个任务。
方法很简单——直接告诉ChatGPT:
输入:
“请判断以下电影评论的情感(正面/负面):例子1:
评论:‘这部电影太棒了!’
情感:正面例子2:
评论:‘浪费时间’
情感:负面例子3:
评论:‘演员表演很自然’
情感:正面现在请判断:
评论:‘剧情拖沓,让人昏昏欲睡’
情感:ChatGPT的回答:
“负面”
只是给了3个例子,ChatGPT就“学会”了这个任务,不需要任何训练。
这就是情境学习。
模型在推理时(不改变预训练参数的情况下),通过提示词中的示例,学会执行一个新任务的能力。
这个定义有几个关键点:
不改变参数
通过示例学习
不是通过明确的指令,而是通过几个具体的例子,让模型自己总结规律。
推理时学习
不是在训练阶段学习,而是在使用模型的时候实时学习。
研究者们发现,情境学习有三种主要形式,能力依次递增:
Tip
关于Shot这个词
在英语中,“shot”原意是“射击”、“尝试”。在机器学习领域,它被借用来指“示例”或“样本”。
这个词来源于体育比赛中的“射门”(shot)概念——就像篮球运动员投篮,每投一次算一次“shot”。在AI领域,每给一个示例,就算给模型一次“尝试的机会”。
不给任何例子,只给任务描述。
输入:
“请将以下句子翻译成英文:
今天天气真好”ChatGPT:
“The weather is really nice today”
这是最直观的。为什么没有给样本也能给出答案?
因为在预训练阶段,模型已经见过无数翻译相关的文本:
"The weather is nice (天气很好)"
"How are you? (你好吗?)"
...
它在预训练中已经学会了中英文之间的对应关系。当收到“请翻译成英文”的指令时,模型能理解意图,并调用这个能力。
这就像Zero-Shot——不需要示例,只需要任务描述,就能激活模型预训练时学到的知识。
给几个例子(通常1-10个),然后执行新任务。
这是情境学习最经典的形式,也是最常用的。
输入:
“请识别以下编程语言:print('Hello, World!') → Python
console.log('Hello, World!'); → JavaScript
System.out.println("Hello, World!"); → Java
现在请识别:
echo "Hello, World!" →ChatGPT:
“PHP”
模型从这三个例子中学到了:
这些都没有明说,但模型从例子中"悟"出来了。
更好玩的例子:
输入:
"将以下句子改为更正式的表达:原句:这东西挺好的
正式:此物品质量上乘原句:他跑得飞快
正式:其奔跑速度极快原句:这事儿太搞笑了
正式:"ChatGPT:
"此事颇为滑稽"
模型学会了:
这些都是从3个例子中学到的。
顾名思义:只给一个例子。
这比Zero-Shot简单,但比Few-Shot困难——模型要从单个例子中推断出整个任务的模式。
输入:
“按照示例格式回答:示例:
输入:苹果
输出:Apple现在:
输入:香蕉
输出:ChatGPT:
“Banana”
从一个例子中,模型推断出:
情境学习甚至能学习全新的、人工设计的任务。
输入:
“按照示例转换:
示例:
输入:cat
输出:tac现在:
输入:dog
输出:
ChatGPT:
“god”
它学会了:反转字母顺序。这是一个完全人工的、训练数据中几乎不可能出现的任务,但模型从一个例子中学会了。
虽然情境学习很强大,但它也有明确的局限。
模型只能学习那些与预训练知识“相关”的任务。
可以学习的:
很难学习的:
受限于上下文窗口长度。
GPT-3的上下文窗口:约4000个Token。
如果一个任务需要看100个例子才能学会,但100个例子超过了4000个Token,模型就学不了。
这限制了情境学习能处理的任务复杂度。
情境学习学习的是"模式",不是"知识"。
比如,给几个"中文→拼音"的例子,模型能学会转换。但这只是应用已有的语音知识,不是真正学到了新东西。
如果告诉模型一个新发明的化学元素的性质,期待它能推理这个元素的其他性质,这是做不到的。模型没有真正"学习"这个新知识,只是记住了输入的内容。
对于重要的、固定的任务,微调仍然更好。
情境学习:
监督微调:
如果是临时任务、快速原型,用情境学习。 如果是核心业务、长期使用,值得微调。
情境学习让模型能从几个例子中快速学会新任务。但在复杂任务上,可能会发现一个问题:
模型直接给出答案,但不展示推理过程;关键是这个答案往往还是错误的。
就像学生做数学题,直接写答案而不展示解题步骤,容易出错。
下一节,我们将学习思维链(Chain-of-Thought)——一种让AI“一步步思考”的方法。这种方法可以让AI展示他的思考过程,同时提高准确率。
这是提示工程中性价比最高的技巧。
Language Models are Few-Shot Learners (GPT-3论文, 2020)
OpenAI发布的GPT-3论文,首次系统地展示In-Context Learning的惊人能力。论文详细探讨了Zero-Shot、One-Shot和Few-Shot三种形式的效果,证明了大模型能够无需重新训练就学会新任务。
| 中文 | English | 音标 | 说明 |
|---|---|---|---|
| 情境学习 | In-Context Learning | /ɪn ˈkɒntekst ˈlɜːnɪŋ/ | 不更新参数、仅靠提示词示例让模型执行新任务的能力 |
| 零样本 | Zero-Shot | /ˈzɪərəʊ ʃɒt/ | 不提供任何示例只给任务描述的情境学习形式 |
| 单样本 | One-Shot | /wʌn ʃɒt/ | 只提供一个示例的情境学习形式 |
| 少样本 | Few-Shot | /fjuː ʃɒt/ | 提供少量示例(通常 3-10 个)的情境学习形式 |
| 示例 | Demonstration | /ˌdemənˈstreɪʃn/ | 在 Prompt 中放置的“问题-答案”样本 |
| 梯度更新 | Gradient Update | /ˈɡreɪdiənt ʌpˈdeɪt/ | 通过反向传播调整模型参数的训练步骤 |
| 归纳 | Induction | /ɪnˈdʌkʃn/ | 从具体示例推断一般模式的过程 |
| 提示词 | Prompt | /prɒmpt/ | 输入给模型的文字指令与上下文 |